/* 
 * File:   LabRaices.cpp
 * Author: jorgeorm
 * 
 * Created on 25 de diciembre de 2011, 11:16 AM
 */

#include "LabRaices.h"
#include "RaizProblemaPolinomio.h"
#include <iostream>
#include <cstdlib>
using namespace std;

LabRaices::LabRaices() {
    this->cotaError=-1;
    this->hMuller=0;
    this->xLow=0;
    this->xUp=0;
    this->objRaizProblema=new RaizProblemaAhorro();

}

LabRaices::LabRaices(long double cotaError) {
    this->cotaError=cotaError;
    this->xLow=0;
    this->xUp=0;
    this->objRaizProblema=new RaizProblemaAhorro();
}

//LabRaices::LabRaices(const LabRaices& orig) {
//}

LabRaices::~LabRaices() {
    Raiz * objRaizProblema;
    this->cotaError=0;
    this->xLow=0;
    this->xUp=0;
    this->objRaizProblema->~Raiz();
    this->objRaizProblema=NULL;
}

void LabRaices::paramsBipart(){
    long double cotaUp=0;
    long double cotaLow=0;
    cout<<"Ingrese el valor para la cota inferior xL: ";
    cin>>cotaLow;
    
    cout<<"Ingrese el valor de la cota superior xU:  ";
    cin>>cotaUp;
       
    this->xLow=cotaLow;
    this->xUp=cotaUp;
}

void LabRaices::paramsSecan()
{
    long double a=0;
    long double b=0;
    
    cout<<"Ingrese un valor cercano a la raiz para Xi-1: ";
    cin>>a;
    cout<<"Ingrese un valor cercano a la raiz para Xi: ";
    cin>>b;
    cotaIter=-1;
    while(cotaIter<=0){
        cout<<"Ingrese un numero maximo de iteraciones para encontrar la raiz: ";
        cin>>cotaIter;
        if(cotaIter<=0) cout<<"############Valor no valido############"<<endl;
    }
    
    this->xLow=a;
    this->xUp=b;
}


void LabRaices::paramsNewton(){
    long double valorInicial=0;
    cout<<"Ingrese el valor para la xInicial: ";
    cin>>valorInicial;
    cotaIter=-1;
    while(cotaIter<=0){
        cout<<"Ingrese un numero maximo de iteraciones para encontrar la raiz: ";
        cin>>cotaIter;
        if(cotaIter<=0) cout<<"############Valor no valido############"<<endl;
    }
    
    this->xLow=valorInicial;
}

void LabRaices::puntoUno(){
    cotaError=-1;
    int metodo=0;
    long double raizCalculada = 0;

    
    cout<<"Punto No. 1, por favor ingrese los parametros para resolver:"<<endl;
    while(metodo>3 || metodo<1)
    {
        cout<<"Seleccione el método para el calculo de raices:"<<endl;
        cout<<"[1]: Bisección"<<endl;
        cout<<"[2]: Newton-Raphson"<<endl;
        cout<<"[3]: Secante"<<endl;
        cin>>metodo;
        if(metodo>3 || metodo<1) cout<<"##########VALOR NO VALIDO##########"<<endl;
    }
    
    while(cotaError>100 || cotaError<0)
    {
        cout<<"Ingrese el valor percentil para la cota del error, [0]: 0.005% valor por omisión:";
        cin>>cotaError;
        cout<<endl;
        if(cotaError>100 || cotaError<0) cout<<"##########VALOR NO VALIDO##########"<<endl;
    }
    
    if (cotaError>0) {
        objRaizProblema->setCotaError(cotaError);
    }
    
    switch (metodo){
        case 1:
            this->paramsBipart();
            cout<<"####################RESPUESTA####################"<<endl;
            raizCalculada = objRaizProblema->biseccion(xLow,xUp);
            
        break;
        case 2:
            this->paramsNewton();
            cout<<"####################RESPUESTA####################"<<endl;
            raizCalculada= objRaizProblema->newtonRaphson(xLow,cotaIter);
            
        break;
        case 3:
            this->paramsSecan();
            cout<<"####################RESPUESTA####################"<<endl;
            raizCalculada = objRaizProblema->secante(xLow, xUp, cotaIter);
            
        break;
    }
    //FLUSH DE VARIABLES PARA LAS PETICIONES DE PARAMETROS
    //
    cotaIter=-1;
 }

void LabRaices::puntoDos(){
    objRaizProblema=NULL;
    objRaizProblema= new RaizProblemaPolinomio();
    cotaError=-1;
    cotaIter=-1;
    
    while(cotaError>100 || cotaError<0)
    {
        cout<<"Ingrese el valor percentil para la cota del error, [0]: 0.005% valor por omisión:";
        cin>>cotaError;
        cout<<endl;
        if(cotaError>100 || cotaError<0) cout<<"##########VALOR NO VALIDO##########"<<endl;
    }
    
    if (cotaError>0) {
        objRaizProblema->setCotaError(cotaError);
    }
//   Resuelvo el punto 2
//    
    long double valorInicial;
    this->paramsNewton();
    cout<<"################ Respuesta Newton ################"<<endl;
    objRaizProblema->newtonRaphson(xLow, cotaIter);
    cout<<"############################################"<<endl;
    this->paramsMuller();
    cout<<"################ Respuesta Muller ################"<<endl;
    objRaizProblema->muller(cotaIter, xLow, hMuller);
    cout<<"############################################"<<endl;
    
            
}

void LabRaices::paramsMuller(){
    long double valorInicial=0;
    long double hInicial=0;
    cout<<"Ingrese el valor para la xInicial: ";
    cin>>valorInicial;
    cotaIter=-1;
    while(cotaIter<=0){
        cout<<"Ingrese un numero maximo de iteraciones para encontrar la raiz: ";
        cin>>cotaIter;
        if(cotaIter<=0) cout<<"############Valor no valido############"<<endl;
    }
//    Verificación para la distancia del punto
//    
    while(hInicial<=0){
        cout<<"Ingrese el valor de la distancia para los puntos x1, y x2 (): ";
        cin>>hInicial;
        if(hInicial<=0) cout<<"############Valor no valido############"<<endl;
    }
    
    this->xLow=valorInicial;
    this->hMuller=hInicial;
}

